package com.bitoon.basketdudes.web;

import com.bitoon.basketdudes.web.datos.*;
import com.bitoon.basketdudes.web.jpa.*;
import java.util.List;

import javax.persistence.*;
import org.apache.log4j.Logger;

public class BaseListadoResultados extends BaseActionServletAware {

    private Logger log = Logger.getLogger(Index.class);

    private int pagina = 1;
    private InfoCabeceraXHR cabecera = new InfoCabeceraXHR();

    public final List<Partido> getPartidosPasadosLimit(int limit) {

        EntityManager em = null;

        List<Partido> retorno = null;

        try {
            em = emfBasket.createEntityManager(); // checked
            Query q = em.createNamedQuery("Partido.findPasados");
            q.setMaxResults(limit);

            retorno = (List<Partido>)q.getResultList();

            log.debug("\n\n ENTRO >>>>>>>>>>>>>>>>>>>>>>>>>>>>> " + retorno.size());
        } catch (Exception e) {
            log.error("[getPartidosPasadosLimit]: " , e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }

    public final Parcial getParcial(int idEquipo1, int idEquipo2) {
        Parcial retorno = null;

        if (idEquipo2 < idEquipo1) {
            retorno = getParcialOrdenado(idEquipo2, idEquipo1);
            short aux = retorno.getVictorias1();
            retorno.setVictorias1(retorno.getVictorias2());
            retorno.setVictorias2(aux);
        } else {
            retorno = getParcialOrdenado(idEquipo1, idEquipo2);
        }

        return retorno;
    }

    private final Parcial getParcialOrdenado(int idEquipo1, int idEquipo2) {
        EntityManager em = null;

        Parcial retorno = null;

        try {

            em = emfBasket.createEntityManager(); // checked
            Query q = em.createNamedQuery("Parcial.findById");
            q.setParameter("idEquipo1", idEquipo1);
            q.setParameter("idEquipo2", idEquipo2);

            retorno = (Parcial)q.getSingleResult();
        } catch (NoResultException nre) {
            log.debug("[getParcialOrdenado] No se ha encontrado registro para valores (idEquipo1=" + idEquipo1 + ", idEquipo2 =" + idEquipo2);
        } catch (Exception e) {
            log.error("[getParcialOrdenado]: " + e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }

    public final DatosMejoresJugadoresPartido getDatosMejoresJugadores(int idPartido, int idEquipo) {

        DatosMejoresJugadoresPartido retorno = null;

        EntityManager em = null;

        try {

            EstJugadorPartido e = null;
            retorno = new DatosMejoresJugadoresPartido();

            em = emfBasket.createEntityManager(); // checked
            Query q = em.createNamedQuery("EstJugadorPartido.findByPartidoIdEquipoIdOrderPuntosDesc");
            q.setParameter("partidoId", idPartido);
            q.setParameter("equipoId", idEquipo);
            q.setMaxResults(1); // Sólo el "top"

            e = (EstJugadorPartido)q.getSingleResult();

            retorno.setJpuntos(e.getEstJugadorPartidoPK().getJugador());
            retorno.setPuntos((float)e.getPuntos());

            q = em.createNamedQuery("EstJugadorPartido.findByPartidoIdEquipoIdOrderRebotesDesc");
            q.setParameter("partidoId", idPartido);
            q.setParameter("equipoId", idEquipo);
            q.setMaxResults(1); // Sólo el "top"

            e = (EstJugadorPartido)q.getSingleResult();

            retorno.setJrebotes(e.getEstJugadorPartidoPK().getJugador());
            retorno.setRebotes((float)e.getRebotes());

            q = em.createNamedQuery("EstJugadorPartido.findByPartidoIdEquipoIdOrderAsistenciasDesc");
            q.setParameter("partidoId", idPartido);
            q.setParameter("equipoId", idEquipo);
            q.setMaxResults(1); // Sólo el "top"

            e = (EstJugadorPartido)q.getSingleResult();

            retorno.setJasistencias(e.getEstJugadorPartidoPK().getJugador());
            retorno.setAsistencias((float)e.getAsistencias());

        } catch (NoResultException nre) {
            log.debug("[DatosMejoresJugadoresPartido] No se ha encontrado registro para valores (idPartido=" + idPartido + ", idEquipo =" + idEquipo);
        } catch (Exception e) {
            log.error("[DatosMejoresJugadoresPartido]: " + e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }


        return retorno;

    }

    public final EstEquipoPartido getEstadisticasEquipoPartido(int idEquipo, int idPartido) {

        EntityManager em = null;

        EstEquipoPartido retorno = null;

        try {

            em = emfBasket.createEntityManager(); // checked
            Query q = em.createNamedQuery("EstEquipoPartido.findByPartidoIdEquipoId");
            q.setParameter("equipoId", idEquipo);
            q.setParameter("partidoId", idPartido);

            retorno = (EstEquipoPartido)q.getSingleResult();
        } catch (NoResultException nre) {
            log.debug("[getEstadisticasEquipoPartido] No se ha encontrado registro para valores (idEquipo=" + idEquipo + ", idPartido=" + idPartido);
        } catch (Exception e) {
            log.error("[getEstadisticasEquipoPartido]: " + e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }

    public final List<Partido> getPartidosPasadosIdEquipoLimit(int idEquipo) {

        EntityManager em = null;
        List<Partido> retorno = null;

        try {
            log.debug("\nEjecutando getPartidosPasadosIdEquipoLimit\n");
            em = emfBasket.createEntityManager(); // checked
            Query q = em.createNamedQuery("Partido.findPasadosByEquipoId");
            q.setParameter("equipoId", idEquipo);

            int totalRegistros = q.getResultList().size();
            int totalPaginas = (totalRegistros-1)/LISTADO_RESULTADOS_ELEMENTOS_POR_PAGINA + 1;
            int offset = (pagina-1) * LISTADO_RESULTADOS_ELEMENTOS_POR_PAGINA;

            q = em.createNamedQuery("Partido.findPasadosByEquipoId");
            q.setParameter("equipoId", idEquipo);
            q.setFirstResult((pagina-1)*LISTADO_RESULTADOS_ELEMENTOS_POR_PAGINA);
            q.setFirstResult(offset);
            q.setMaxResults(LISTADO_RESULTADOS_ELEMENTOS_POR_PAGINA);

            retorno = (List<Partido>)q.getResultList();

            getCabecera().setCorrecto(1);
            getCabecera().setActual(getPagina());
            getCabecera().setTotal(totalPaginas);
            getCabecera().setElementos(LISTADO_RESULTADOS_ELEMENTOS_POR_PAGINA);
            getCabecera().setElementoInicial(offset);
            getCabecera().setElementoFinal(offset + retorno.size());

            int p1=0, p2=0;

            if (pagina <= (LISTADO_RESULTADOS_HUECOS_LADO_PAGINA+1)) {
                p1 = 1;
                p2 = LISTADO_RESULTADOS_HUECOS_LADO_PAGINA*2 + 1;
            } else if (pagina >= (totalPaginas-LISTADO_RESULTADOS_HUECOS_LADO_PAGINA)) {
                p1 = totalPaginas - (LISTADO_RESULTADOS_HUECOS_LADO_PAGINA*2);
                p2 = totalPaginas;
            } else {
                p1 = pagina - LISTADO_RESULTADOS_HUECOS_LADO_PAGINA;
                p2 = pagina + LISTADO_RESULTADOS_HUECOS_LADO_PAGINA;
            }
            if (p2 > totalPaginas) {
                p2 = totalPaginas;
            }
            getCabecera().setPrimeraPagina(p1);
            getCabecera().setUltimaPagina(p2);

            log.debug("=====================================");
            log.debug("pagina: " + getPagina());
            log.debug("offset: " + offset);
            log.debug("total paginas: " + totalPaginas);
            log.debug("Primera pagina: " + p1);
            log.debug("Ultima pagina: " + p2);
            log.debug("retorno: " + retorno);
            log.debug("total partidos: " + totalRegistros);
            log.debug("=====================================\n");
        } catch (Exception e) {
            log.error("[getPartidosPasadosIdEquipoLimit]: " + e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }

    public final List<Partido> getPartidosIdEquipoAdmin(int idEquipo) {

        EntityManager em = null;
        List<Partido> retorno = null;

        try {
            log.debug("[getPartidosIdEquipoAdmin] ID_equipo: " +idEquipo);
            em = emfBasket.createEntityManager(); // checked
            Query q = em.createNamedQuery("Partido.findAllFromUser");
            q.setParameter("equipoId", idEquipo);

            int totalRegistros = q.getResultList().size();
            int totalPaginas = (totalRegistros-1)/LISTADO_RESULTADOS_ELEMENTOS_POR_PAGINA + 1;
            int offset = (pagina-1) * LISTADO_RESULTADOS_ELEMENTOS_POR_PAGINA;

            q = em.createNamedQuery("Partido.findAllFromUser");
            q.setParameter("equipoId", idEquipo);
            q.setFirstResult((pagina-1)*LISTADO_RESULTADOS_ELEMENTOS_POR_PAGINA);
            q.setFirstResult(offset);
            q.setMaxResults(LISTADO_RESULTADOS_ELEMENTOS_POR_PAGINA);

            retorno = (List<Partido>)q.getResultList();

            getCabecera().setCorrecto(1);
            getCabecera().setActual(getPagina());
            getCabecera().setTotal(totalPaginas);
            getCabecera().setElementos(LISTADO_RESULTADOS_ELEMENTOS_POR_PAGINA);
            getCabecera().setElementoInicial(offset);
            getCabecera().setElementoFinal(offset + retorno.size());

            int p1=0, p2=0;

            if (pagina <= (LISTADO_RESULTADOS_HUECOS_LADO_PAGINA+1)) {
                p1 = 1;
                p2 = LISTADO_RESULTADOS_HUECOS_LADO_PAGINA*2 + 1;
            } else if (pagina >= (totalPaginas-LISTADO_RESULTADOS_HUECOS_LADO_PAGINA)) {
                p1 = totalPaginas - (LISTADO_RESULTADOS_HUECOS_LADO_PAGINA*2);
                p2 = totalPaginas;
            } else {
                p1 = pagina - LISTADO_RESULTADOS_HUECOS_LADO_PAGINA;
                p2 = pagina + LISTADO_RESULTADOS_HUECOS_LADO_PAGINA;
            }
            if (p2 > totalPaginas) {
                p2 = totalPaginas;
            }
            getCabecera().setPrimeraPagina(p1);
            getCabecera().setUltimaPagina(p2);

        } catch (Exception e) {
            log.error("[getPartidosIdEquipoAdmin]: " + e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }

    public final List<EstJugadorPartido> getEstadisticasJugadorPartido(int idEquipo, int idPartido) {

        EntityManager em = null;

        List<EstJugadorPartido> retorno = null;

        try {

            em = emfBasket.createEntityManager(); // checked
            Query q = em.createNamedQuery("EstJugadorPartido.findByPartidoIdEquipoId");
            q.setParameter("equipoId", idEquipo);
            q.setParameter("partidoId", idPartido);

            retorno = (List<EstJugadorPartido>)q.getResultList();
        } catch (NoResultException nre) {
            log.debug("[getEstadisticasJugadorPartido] No se ha encontrado registro para valores (idEquipo=" + idEquipo + ", idPartido=" + idPartido);
        } catch (Exception e) {
            log.error("[getEstadisticasJugadorPartido]: " + e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }

    public int getPagina() {
        return pagina;
    }

    public void setPagina(int pagina) {
        this.pagina = pagina;
    }

    public InfoCabeceraXHR getCabecera() {
        return cabecera;
    }

    public void setCabecera(InfoCabeceraXHR cabecera) {
        this.cabecera = cabecera;
    }
}
